<?php

Loader::using("ext::libs::MicrosoftDateFormatter");

/**
 * Description of ActualizarDatos
 *
 * @author MFerreira
 * @export Modules
 * @export-metadata category:Datos:Actualizar mis datos
 * @export-metadata RequiredRoles:ROLE_STUDENT
 */
class ActualizarDatos extends Module {

    /**
     *
     * @var Estudiantes
     */
    private $student;

    public function index() {
        $this->student = $this->model->students->GetById($this->currentUser->getName());

        if($this->student->getDatosMadre() == NULL){
            $this->student->setDatosMadre(new Personas());
        }
        if($this->student->getDatosPadre() == null){
            $this->student->setDatosPadre(new Personas());
        }
        if($this->student->getDatosCorreo() == null){
            $this->student->setDatosCorreo(new DatosContacto());
        }
        
        $this->loadPersonalData();
        $this->loadEmploymentData();
        $this->loadLanguagesData();
        $this->loadAcademicData();

        $this->display("index");
    }

    public function Update() {
        if ($this->request->submitted()) {
            /* @var $student Estudiantes */
            $student = $this->model->students->GetById($this->currentUser->getName());

            if (!$student->getTipoSangre()) {
                $student->setTipoSangre(new TipoSangre());
            }
            if (!$student->getLugarNacimiento()) {
                $student->setLugarNacimiento(new Municipios());
            }
            if (!$student->getConyugue()) {
                $student->setConyugue(new Personas());
            }
            
            if(!$student->getDatosPadre()){
                $student->setDatosPadre(new Personas());
                $student->getDatosPadre()->setDatosLaborales(new DatosLaboral());
            }
            
            if(!$student->getDatosMadre()){
                $student->setDatosMadre(new Personas());
                $student->getDatosMadre()->setDatosLaborales(new DatosLaboral());
            }
            

            $this->request->bind($student);
            
            $response = $this->model->students->Update($student);

            $this->updateChildren($student);

            $this->addMessage(new Message("Sus datos personales han sido actualizados.", "", Message::SUCCESS));
            $this->assign("action", $this->route->moduleAction("Perfiles", "index"));
            $this->display();
        } else {
            $this->index();
        }
    }

    public function AddInformacionLaboral() {
        Loader::using("models::entities::HistorialLaboral");

        $InformacionLaboral = new HistorialLaboral();

        $InformacionLaboralPk = new HistorialLaboralPk();
        $InformacionLaboralPk->setCodigoInterno($this->request->get("CodigoInterno"));
        $InformacionLaboralPk->setSecuencia(0);

        $InformacionLaboral->setHistorialLaboralPk($InformacionLaboralPk);
        $this->modifyInformacionLaboral($InformacionLaboral);

        echo $this->model->employment->Create($InformacionLaboral);

        $this->ShowInformacionLaboral();
    }

    public function EditInformacionLaboral() {
        $InformacionLaboralPk = $this->retrieveHistorialLaboralPK();
        $InformacionLaboral = $this->model->employment->GetById($InformacionLaboralPk);

        $this->modifyInformacionLaboral($InformacionLaboral);

        echo $this->model->employment->Update($InformacionLaboral);

        $this->ShowInformacionLaboral();
    }

    public function DeleteInformacionLaboral() {
        $InformacionLaboralPk = $this->retrieveHistorialLaboralPK();
        $this->model->employment->Delete($InformacionLaboralPk);
        $this->ShowInformacionLaboral();
    }

    public function AddInformacionAcademica() {
        Loader::using("models::entities::HistorialAcademico");
        $InformacionAcademica = new HistorialAcademico();

        $this->modifyInformacionAcademica($InformacionAcademica);

        echo $this->model->academicHistory->Create($InformacionAcademica);
        $this->ShowInformacionAcademica();
    }

    public function DeleteInformacionAcademica() {
        $InformacionAcademicoPk = $this->retrieveHistorialAcademicoPK();
        echo $this->model->academicHistory->Delete($InformacionAcademicoPk);
        $this->ShowInformacionAcademica();
    }

    public function AddInformacionIdiomas() {
        if ($this->request->submitted()) {
            Loader::using("models::entities::ManejoIdiomas");
            $data = $this->request->post("HistorialIdiomas");

            $manejoIdiomas = new ManejoIdiomas();

            $manejoIdiomasPK = new ManejoIdiomasPk();
            $manejoIdiomasPK->setCodigoInterno($data["CodigoInterno"]);
            $manejoIdiomasPK->setCodigoIdioma($data["Codigo"]);
            $manejoIdiomas->setManejoIdiomasPk($manejoIdiomasPK);

            $idioma = new Idiomas();
            $idioma->setCodigoIdioma($data["Codigo"]);
            $manejoIdiomas->setIdioma($idioma);

            $this->ModifyIdiomas($manejoIdiomas);

            echo $this->model->languages->addLanguageSkill($manejoIdiomas);
        }
        $this->ShowInformacionIdiomas();
    }

    public function EditInformacionIdiomas() {

        $manejoIdiomas = $this->model->languages->getLanguageSkill($this->retrieveHistorialIdiomasPK());

        $this->ModifyIdiomas($manejoIdiomas);

        $this->model->languages->updateLanguageSkill($manejoIdiomas);
        $this->ShowInformacionIdiomas();
    }

    public function DeleteInformacionIdiomas() {
        $menejoIdiomasPk = $this->retrieveHistorialIdiomasPK();
        $this->model->languages->deleteLanguageSkill($menejoIdiomasPk);
        $this->ShowInformacionIdiomas();
    }

    //<editor-fold defaultstate="expanded" desc="Helper functions...">

    private function ShowInformacionAcademica() {
        $this->student = $this->model->students->GetById($this->currentUser->getName());
        $this->loadAcademicData();

        $this->display("InformacionAcademica");
    }

    private function ShowInformacionLaboral() {
        /* @var $student Estudiantes */
        $this->student = $this->model->students->GetById($this->currentUser->getName());

        $this->loadEmploymentData();

        $this->display("InformacionLaboral");
    }
    
    public function ShowInformacionIdiomas() {
        /* @var $student Estudiantes */
        $this->student = $this->model->students->GetById($this->currentUser->getName());

        $this->loadLanguagesData();

        $this->display("InformacionIdiomas");
    }

    private function retrieveHistorialLaboralPK() {
        Loader::using("models::entities::HistorialLaboralPk");
        $InformacionLaboralPk = new HistorialLaboralPk();
        $InformacionLaboralPk->setCodigoInterno($this->request->get("CodigoInterno"));
        $InformacionLaboralPk->setSecuencia($this->request->get("Secuencia"));

        return $InformacionLaboralPk;
    }

    private function modifyInformacionLaboral(HistorialLaboral &$InformacionLaboral) {

        $historialEmpresa = $this->request->post("HistorialEmpresa");

        $InformacionLaboral->setOcupacion($historialEmpresa["Ocupacion"]);
        $InformacionLaboral->setFechaIngreso(MicrosoftDateFormatter::toJSON($historialEmpresa["FechaIngreso"], "d/m/Y"));
        $InformacionLaboral->setNaturaleza($historialEmpresa["Naturaleza"]);
        $InformacionLaboral->setSector($historialEmpresa["Sector"]);
        $InformacionLaboral->setSalario($historialEmpresa["Salario"]);

        $DatosLaboral = new DatosLaboral();
        $DatosLaboral->setNombreEmpresa($historialEmpresa["Nombre"]);

        $DatosContacto = new DatosContacto();
        $DatosContacto->setDireccion($historialEmpresa["Direccion"]);
        $DatosContacto->setTelefono($historialEmpresa["Telefono"]);
        $DatosContacto->getMunicipio()->setNombre($historialEmpresa["Ciudad"]);
        $DatosLaboral->setDatosEmpresa($DatosContacto);

        $InformacionLaboral->setDatosLaboral($DatosLaboral);

        $InformacionLaboral->setCodigoPais($historialEmpresa["Pais"]);
    }

    private function updateChildren(Estudiantes &$student) {
        $children = $this->request->post("Hijos", array());
        $originalChildrenList = $student->getHijos();

        foreach ($originalChildrenList as /* @var $child Hijos */$child) {
            $this->model->children->delete($child->getHijoPk());
        }

        foreach ($children as $child) {
            $son = new Hijos();
            $son->getHijoPk()->setCodigoInterno($student->getCodigoInterno());
            $son->getHijoPk()->setNombre($child["Nombre"]);
            $son->getHijoPk()->setFechaNacimiento(MicrosoftDateFormatter::toJSON($child["FechaNacimiento"]));

            $this->model->children->add($son);
        }
    }

    private function loadPersonalData() {
        $this->assign("lugarNacimientoIsset", $this->issetLugarNacimiento($this->student->getLugarNacimiento()));
        //$this->assign("lugarRecidenciaIsset", $this->issetLugarResidencia());
        $this->assign("student", $this->student);
        $this->assign("estadosCiviles", Asociados::$EstadosCiviles);

        $this->assign("estratos", array("1", "2", "3", "4", "5", "6",));
        $this->assign("tiposDeSangre", TipoSangre::$nombresGrupos);
        $this->assign("RHs", array("+", "-"));

        $isEgresado = $this->request->get("NoFrame", 0);
        $this->assign("action", $this->route->action("Update", array("NoFrame" => $isEgresado,)));

        $this->assign("viewLaboral", $this->route->moduleAction("InformacionLaboral", "ShowInformacionLaboral"));
        $this->assign("viewAcademico", $this->route->moduleAction("InformacionAcademica", "ShowInformacionAcademica"));
        $this->assign("viewIdiomas", $this->route->moduleAction("InformacionIdiomas", "ShowInformacionIdiomas"));

        $this->assign("paises", $this->model->countries->GetAll(false));
    }

    private function loadEmploymentData() {

        $sectores = array(
            1 => "Mineria",
            2 => "Petrolera",
            3 => "Automotriz",
            4 => "Construcci&oacute;n",
            5 => "Energ&eacute;tico",
            6 => "Ganaderia",
            7 => "Agricultura",
            8 => "Manufacturera",
            9 => "Turismo",
            10 => "Aerea",
            11 => "Banca",
            12 => "Comunicaciones/Transporte",
            13 => "Educaci&oacute;n",
            14 => "Salud",
        );

        $rangosSalariales = array(
            0 => "Menos de 1'000.000",
            1 => "Entre 1'000.000 y 1'500.000",
            2 => "Entre 1'500.000 y 2'000.000",
            3 => "Entre 2'000.000 y 2'500.000",
            4 => "Entre 2'500.000 y 3'000.000",
            5 => "Entre 3'000.000 y 3'500.000",
            6 => "Entre 3'500.000 y 4'000.000",
            7 => "Entre 4'000.000 y 4'500.000",
            8 => "M&aacute;s de 4'500.000",
        );

        $this->assign("CodigoInterno", $this->student->getCodigoInterno());
        $this->assign("historialLaboral", $this->student->getHistorialLaboral());
        $this->assign("sectores", $sectores);
        $this->assign("naturalezas", array_flip(Naturaleza::values()));
        $this->assign("paises", $this->model->countries->GetAll(false));
        $this->assign("rangosSalariales", $rangosSalariales);
    }

    private function loadLanguagesData() {
        $nivelesIdiomas = array_flip(NivelesIdiomas::values());

        $this->assign("addIdiomas", $this->route->action("add", array("ajax" => true)));
        $this->assign("editIdiomas", $this->route->action("edit", array("ajax" => true)));
        $this->assign("deleteIdiomas", $this->route->action("delete", array("ajax" => true)));

        $this->assign("manejoIdiomas", $this->student->getManejoIdiomas());
        $this->assign("nivelesIdiomas", $nivelesIdiomas);
        $this->assign("idiomas", $this->model->languages->GetAll());
        $this->assign("CodigoInterno", $this->student->getCodigoInterno());
    }

    private function loadAcademicData() {

        $this->assign("historialAcademico", $this->student->getHistorialAcademico());
        $this->assign("nivelesPosgrado", array_flip(NivelPosgrado::values()));
        $this->assign("CodigoInterno", $this->student->getCodigoInterno());
    }

    private function retrieveHistorialAcademicoPK() {
        Loader::using("models::entities::HistorialAcademicoPk");
        $InformacionAcademicoPk = new HistorialAcademicoPk();
        $InformacionAcademicoPk->setCodigoInterno($this->request->get("CodigoInterno"));
        $InformacionAcademicoPk->setCodigoInstitucion($this->request->get("CodigoInstitucion"));
        $InformacionAcademicoPk->setTitulo($this->request->get("TituloRecibido"));

        return $InformacionAcademicoPk;
    }

    private function modifyInformacionAcademica(HistorialAcademico &$InformacionAcademica) {
        $data = $this->request->post("HistorialAcademico");

        $InformacionAcademicaPk = new HistorialAcademicoPk();
        $InformacionAcademicaPk->setCodigoInterno($data["CodigoInterno"]);
        $InformacionAcademicaPk->setTitulo($data["TituloRecibido"]);

        $InformacionAcademica->setHistorialAcademicoPk($InformacionAcademicaPk);

        $Institucion = new Instituciones();
        $Institucion->setNombreInstitucion($data["Nombre"]);

        $InformacionAcademica->setInstitucion($Institucion);
        $InformacionAcademica->setFechaGrado(MicrosoftDateFormatter::toJSON($data["FechaDeGraduacion"]));
        $InformacionAcademica->setNivelPosgrado($data["NivelPosgrado"]);
    }

    private function retrieveHistorialIdiomasPK() {
        Loader::using("models::entities::ManejoIdiomasPk");
        $manejoIdiomasPK = new ManejoIdiomasPk();
        $manejoIdiomasPK->setCodigoInterno($this->request->get("CodigoInterno"));
        $manejoIdiomasPK->setCodigoIdioma($this->request->get("CodigoIdioma"));

        return $manejoIdiomasPK;
    }

    private function ModifyIdiomas(ManejoIdiomas &$manejoIdiomas) {
        $data = $this->request->post("HistorialIdiomas");
        $manejoIdiomas->setEscribe($data["Escribe"]);
        $manejoIdiomas->setHabla($data["Habla"]);
        $manejoIdiomas->setLee($data["Lee"]);
    }
    /**
     *
     * @param Municipios $lugarNacimiento 
     */
    private function issetLugarNacimiento($lugarNacimiento) {
        $result = false;
        if ($lugarNacimiento &&
                $lugarNacimiento->getNombre() &&
                $lugarNacimiento->getDepartamento() &&
                $lugarNacimiento->getDepartamento()->getNombre() &&
                $lugarNacimiento->getDepartamento()->getPais() &&
                $lugarNacimiento->getDepartamento()->getPais()->getNombre()) {
            $result = true;
        }
        return $result;
    }
    private function issetLugarResidencia($lugarRecidencia) {
        $result = false;
        if ($lugarRecidencia &&
                $lugarRecidencia->getNombre() &&
                $lugarRecidencia->getDepartamento() &&
                $lugarRecidencia->getDepartamento()->getNombre() &&
                $lugarRecidencia->getDepartamento()->getPais() &&
                $lugarRecidencia->getDepartamento()->getPais()->getNombre()) {
            $result = true;
        }
        return $result;
    }

    //</editor-fold>
}

?>
